90 POKE53280,11:POKE53281,0:PRINT"[153][147]" 100 PRINT"DISK CHECKER[146] - JIM BUTTERFIELD":POKE1170,48 110 DIM A(255),C%(77,28),D%(1),N$(224),T%(224,1),S%(224,1),L%(224),R%(77) 120 D%(0)=58:D%(1)=42:Z$=CHR$(0) 130 DATA 1,17,20,24,19,30,17,35,16,0 140 DATA 65,17,20,24,18,30,17,35,16,0 150 DATA 67,39,28,53,26,64,24,77,22,0 160 B$=CHR$(17):INPUT"DRIVE#(0-1)";D$:B$=CHR$(3) 170 IFD$<>"0"ANDD$<>"1"GOTO160 180 OPEN15,8,15,"I"+D$:GOSUB3020 190 OPEN3,8,3,"$"+D$:GOSUB3020 200 A0=1:GET#3,A$:A=ASC(A$+Z$) 210 READA1:IFA=A1GOTO250 220 F%=F%+1:IFF%=3GOTO290 230 READA1:IFA1=0GOTO210 240 GOTO230 250 READA1:IFA1=0GOTO270 260 READB1:FORJ=A0TOA1:R%(J)=B1:NEXTJ:A0=J:GOTO250 270 IFA=1ORA=65THEND1=1:T9=35:S9=3:D9=18 280 IFA=67THEND1=257:T9=77:S9=4:D9=39 290 IFT9=0THENCLOSE3:PRINT:PRINT"?? DISK NOT RECOGNIZED ??[153][146]":STOP 300 REM****GET AND PRINT BAM**** 310 PRINT"[147] FREE BLOCK MAP" 315 PRINT:PRINT" : =USED * =FREE":PRINT 320 FORJ=1TOD1:GET#3,A$:NEXTJ 330 FORJ=1TOT9:T1=0 340 IFJ=51THENGET#3,A$,A$,A$,A$ 350 GET#3,A$:C=ASC(A$+Z$) 360 PRINTRIGHT$(" "+STR$(J),2);" "; 370 K1=0:FORK=0TOS9-1:GET#3,A$:A=ASC(A$+Z$) 380 FORL=0TO7:A%=A/2:D1=A-A%*2:IFK1<=R%(J)THENC%(J,K1)=D1:PRINTCHR$(D%(D1)); 390 A=A%:T1=T1+D1:K1=K1+1:NEXTL,K:PRINT 400 IFT1<>CTHENPRINT"?"; 410 NEXTJ 420 REM DO SPECIFIC JOB 430 PRINT"[147]":CLOSE3:PRINT " CHOOSE --" 440 PRINT "1. CHECK ALL FILES" 450 PRINT "2. CHECK FOR BAD SPOTS" 460 PRINT "3. RECOVER SCRATCHED FILE" 470 PRINT " YOUR CHOICE? "; 480 GETX$:IFX$=""GOTO480 490 X=ASC(X$)-48:IFX<1ORX>3GOTO480 500 PRINTX$:OPEN2,8,2,"#0":GOSUB3020 510 ONXGOTO520,790,890 520 REM CHECK FILES 530 T=D9:S=1 540 GOSUB2000 550 FORD=2TO255STEP32:IFA(D)<128GOTO590 560 D3=D3+1:T%(D3,0)=A(D+1):S%(D3,0)=A(D+2):L%(D3)=A(D+28)+A(D+29)*256 570 IFA(D)=132THENT%(D3,1)=A(D+19):S%(D3,1)=A(D+20) 580 N$="":FORK=D+3TOD+18:N$=N$+CHR$(A(K)):NEXTK:N$(D3)=N$ 590 NEXTD 600 T=A(0):S=A(1):IFT=D9GOTO540 610 FORD=1TOD3:L%=0 620 PRINTN$(D); 630 T=T%(D,0):S=S%(D,0) 640 IFT>T9ORS<0THENT=0 650 IFT<1ORS>R%(T)THENPRINT" BAD CHAIN":GOTO770 660 IFC%(T,S)=1THENPRINT" UNALLOCATED BLOCKS":GOTO770 670 IFC%(T,S)>1THENPRINT" CONFLICT ";N$(C%(T,S)-1):GOTO770 680 C%(T,S)=1+D 690 GOSUB3000 700 L%=L%+1 710 FORJ=0TO1:PRINT#15,"M-R";CHR$(J);B$:GET#15,A$ 720 A(J)=ASC(A$+Z$):NEXTJ 730 T4=T:S4=S:T=A(0):S=A(1):IFT<>0ANDE=0GOTO640 740 T=T%(D,1):S=S%(D,1):T%(D,1)=0:IFT<>0GOTO640 750 IFL%<>L%(D)THENPRINT" INCORRECT BLOCK COUNT":GOTO770 760 PRINT:PRINT"[145] [145]" 770 NEXTD 780 PRINT:PRINTD3;"FILES":GOTO1270 790 REM SCAN SECTORS 800 IFF%=0THENPRINT"SORRY .. CAN'T DO IT":GOTO1270 810 FORT=1TOT9:PRINT"TRACK";T 820 FORS=0TOR%(T) 830 PRINT"[145] SECT";S 840 GOSUB3000 850 NEXTS 860 PRINT"[145] [145]" 870 NEXTT 880 PRINT"DISK OK":GOTO1270 890 REM UNSCRATCH 900 K=0:PRINT"I WILL LOOK FOR DISCARDED FILES..." 910 T=D9:S=1 920 GOSUB2000 930 FORD=2TO255STEP32:IFA(D)<>0ORA(D+1)=0GOTO980 940 IFK=0THENPRINT"DO YOU WANT TO RECOVER:" 950 GETX$:FORK=D+3TOD+18:PRINTCHR$(A(K));:NEXTK:PRINT"? "; 960 GETX$:IFX$<>"Y"ANDX$<>"N"GOTO960 970 PRINTX$:IFX$="Y"GOTO1010 980 NEXTD 990 T=A(0):S=A(1):IFT=D9GOTO920 1000 PRINT"THAT'S ALL ":GOTO1270 1010 T6=T:S6=S:D6=D:T=A(D+1):S=A(D+2):L%(0)=A(D+28)+A(D+29)*256:L%=0 1020 GETX$:PRINT"IS THIS FILE:" 1030 PRINT" 1. SEQUENTIAL" 1040 PRINT" 2. PROGRAM" 1050 PRINT" 3. USR" 1060 IFA(D+19)=0GOTO1080 1070 PRINT" 4. RELATIVE" 1080 PRINT" WHICH NUMBER? "; 1090 GETX$:IFX$=""GOTO1090 1100 X=ASC(X$)-48:IFX<1ORX>4GOTO1090 1110 PRINTX$:X=X+128 1120 IFX=132THENT%(0,1)=A(D+19):S%(0,1)=A(D+20):IFT%(0,1)=0GOTO1020 1130 IFT>T9ORS<0THENT=0 1140 IFT<1ORS>R%(T)THENPRINT" BAD CHAIN!":GOTO1260 1150 IFC%(T,S)=0THENPRINT" ALLOCATED BLOCKS!":GOTO1260 1160 GOSUB3000:L%=L%+1 1170 FORJ=0TO1:PRINT#15,"M-R";CHR$(J);B$:GET#15,A$ 1180 A(J)=ASC(A$+Z$):NEXTJ 1190 T4=T:S4=S:T=A(0):S=A(1):IFT<>0GOTO1130 1200 T=T%(0,1):S=S%(0,1):T%(0,1)=0:IFT<>0GOTO1130 1210 IFL%<>L%(0)THENPRINT" INCORRECT BLOCK COUNT!":GOTO1260 1220 T=T6:S=S6:D=D6 1230 GOSUB3000 1240 PRINT#15,"M-W";CHR$(D);B$;CHR$(1);CHR$(X) 1250 PRINT#15,"U2:2,";D$;T;S:GOSUB3020:GOTO1300 1260 PRINT "SORRY - IT WON'T WORK" 1270 CLOSE2 1280 INPUT"** GOT TIME TO VALIDATE DISK";X$ 1290 IFASC(X$)=78THENEND 1300 CLOSE2:PRINT#15,"V";D$:END 2000 REM GRAB FULL DISK BLOCK 2010 GOSUB3000 2020 FORJ=0TO255:PRINT#15,"M-R";CHR$(J);B$:GET#15,A$ 2030 A(J)=ASC(A$+Z$):NEXTJ:RETURN 3000 REM READ BLOCK 3010 PRINT#15,"B-R:2,";D$;T;S 3020 REM GET ERROR STATUS 3030 INPUT#15,E,E$,E1,E2 3040 IFE<>0THENPRINT"[158]DISK ERROR:[146][153]"E;E$,E1;E2 3050 RETURN